package jp.co.nes.awssupport.tools.client;

import org.kohsuke.args4j.Option;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jp.co.nes.awssupport.common.base.AbstractClient;
import jp.co.nes.awssupport.common.utility.AwsKmsHelper;
import jp.co.nes.awssupport.common.utility.PropertiesUtil;

/**
 * KMSを使用して、複合した結果を標準出力します。<br>
 * KMSに接続したユーザに設定されているキーで複合することができます。<br>
 * <br>
 * 【クラスパスの設定】
 * awssupport-tools-X.X.X.jar(X.X.Xはバージョン)を設定します。<br>
 * また、log4jの設定ファイルであるlog4j.xmlを、クラスパスのルートに配置する必要があります。<br>
 * <br>
 * 【コマンドライン引数の内容】<br>
 * -v (--value)・・左記オプションに続けて、半角スペース + 複合する文字列を設定(必須)<br>
 * <br>
 * 【プロパティの内容(※1)】<br>
 * AccessKey・・KMSに接続する際に使用するアクセスキーを設定(必須)<br>
 * SecretKey・・KMSに接続する際に使用するシークレットキーを設定(必須)<br>
 * ProxyHost・・KMSに接続する際に使用するプロキシサーバのホストを設定(プロキシーが必要な場合のみ必須)<br>
 * ProxyPort・・KMSに接続する際に使用するプロキシサーバのポートを設定(プロキシーが必要な場合のみ必須)<br>
 * RegionName・・KMSに接続する際のリージョンを設定(省略可、省略した場合は「ap-northeast-1」)<br>
 * <br>
 * (※1) システムプロパティ or プロパティファイルで設定。両方に設定されていた場合、システムプロパティの内容が優先されます。<br>
 * <br>
 * 【タイムゾーンの設定】<br>
 * タイムゾーンの設定をシステムプロパティに実施する必要があります(-Duser.timezone=UTC)。<br>
 * <br>
 * 【その他】<br>
 * プロパティファイルの仕様・設定については、{@link PropertiesUtil}を参照。<br>
 * LocalTestプロパティにtrueを設定すると、ローカルテスト用動作になり、AWSに接続しないので、複合する場合には、
 * LocalTestプロパティは設定しない事。
 */
public class DecryptClient extends AbstractClient {

    /** ロガー */
    private static Logger logger = LoggerFactory.getLogger(DecryptClient.class);

    /** 複合する文字列(コマンドライン引数で設定) */
    @Option(name = "-v", aliases = "--value", usage = "複合する文字列", metaVar = "value", required = true)
    private String value;

    /**
     * メインメソッドです。
     *
     * @param args コマンドライン引数
     */
    public static void main(String[] args) {
        DecryptClient client = new DecryptClient();
        client.execute(args);
    }

    /**
     * デフォルトコンストラクタです。
     */
    public DecryptClient() {
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.common.base.AbstractClient#execute()
     */
    @Override
    protected void execute() {
        AwsKmsHelper helper = new AwsKmsHelper();
        String decryptValue = helper.decrypt(value);
        System.out.println("decryptValue=" + decryptValue);
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.common.base.AbstractClient#finish(boolean, java.lang.Throwable)
     */
    @Override
    protected void finish(boolean isSuccess, Throwable throwable) {
        // 特に実装する内容無し
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.common.base.AbstractClient#debugArgument()
     */
    @Override
    protected void debugArgument() {
        if (logger.isDebugEnabled()) {
            logger.debug("value=" + value);
        }
    }
}
